package com.egao.common.module.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.egao.common.core.web.JsonResult;
import com.egao.common.core.web.PageParam;
import com.egao.common.module.system.entity.Dict;

import java.util.List;
import java.util.Map;

/**
 * 字典服务接口
 * @author lym
 */
public interface DictService extends IService<Dict> {

    /**
     * 根据字典类型查询全部字典 类型为空查询全部 排休升序
     * @param type 字典类型
     * @return 字典集合
     */
    /**
     * 根据字典类型查询全部字典
     * 类型为空查询全部
     * 标签为空查询全部 否则模糊查询
     * 排序根据sort升序
     * @param type 字典类型
     * @param label 字典标签
     * @return 字典集合
     */
    List<Dict> listAll(String type, String label);

    /**
     * 分页查询
     * @param page 查询参数
     * @return 分页结果
     */
    List<Dict> listPage(PageParam<Dict> page);

    /**
     * 查询类型集合
     * @return 类型集合
     */
    List<Dict> listType();

    /**
     * 根据类型和标签值查询单个字典对象
     * @param type 类型
     * @param value 标签值
     * @return Dict
     */
    Dict getByTypeAndValue(String type, String value);

    /**
     * 根据字典类型查询缓存字典列表
     * @param type 字典类型
     * @return 返回字典集合
     */
    List<Dict> cacheList(String type);

    /**
     * 根据字典类型 字典值 查询单个标签
     * @param type 字典类型
     * @param value 字典值
     * @return 返回标签字符串
     */
    String cacheLabel(String type, String value);

    /**
     * 根据字典类型 字典标签 查询字典值
     * @param type 字典类型
     * @param label 标签值
     * @return 字典值
     */
    String cacheValue(String type, String label);

    /**
     * 根据类型字符串集合获取多个类型字典集合
     * @param types 类型字符串集合 逗号分割
     * @return Map<String, List<Dict>>
     */
    Map<String, List<Dict>> cacheMaps(String types);

    /**
     * 根据字典类型查询缓存字典集合
     * 字典类型输出到map时自动转换驼峰
     * @param types 字典数组
     * @return Map<String, List<Dict>>
     */
    Map<String, List<Dict>> cacheMaps(String[] types);

    /**
     * 添加字典
     * @param dict 字典信息
     * @return
     */
    JsonResult insertDict(Dict dict);

    /**
     * 修改字典
     * @param dict 字典信息
     * @return
     */
    JsonResult updateDict(Dict dict);

    /**
     * 删除字典
     * @param id 字典Id
     * @return
     */
    JsonResult dictDelete(Integer id);

    /**
     * 根据字典类型查询缓存单位性质列表
     * @param type 字典类型
     * @return 返回字典集合
     */
    List<Dict> cacheNatureList(String type);

    /**
     * 获取Redis所有字典数据
     * @return 返回字典集合
     */
    Map<Object, Object> getCacheDictMaps();

    /**
     * 根据字典类型查询缓存字典列表
     * @param type 字典类型
     * @param dictMaps 所有字典
     * @return 返回字典集合
     */
    List<Dict> cacheList(String type, Map<Object, Object> dictMaps);

    /**
     * 根据字典类型 字典值 查询单个标签
     * @param type 字典类型
     * @param value 字典值
     * @return 返回标签字符串
     */
    String cacheLabel(String type, String value, Map<Object, Object> dictMaps);

    /**
     * 查询带有父级的字段 如语言证书
     * @param type
     * @param parentId
     * @param value
     * @return
     */
    Dict getByParent(String type, Integer parentId, String value);

    /**
     * 生源需要的字典
     * @return
     */
    Map<String, List<Dict>> studentForm();

    /**
     * 加载字典到redis
     */
    void initRedis();

    /**
     * saveCache
     * 缓存全部字典
     */
    void saveCache();

    /**
     * 从redis中获取标签
     * @param type 字典类型
     * @param value 字典值
     * @return 字典标签
     */
    String redisLabel(String type, String value);

    /**
     * 从redis中获取值
     * @param type 字典类型
     * @param label 字典标签
     * @return 字典值
     */
    String redisValue(String type, String label);

    /**
     * 从redis中获取集合
     * @param type 字典类型
     * @return 字典集合
     */
    List<Dict> redisList(String type);
}
